From: Jan Beulich Date: Wed, 18 Aug 2021 07:40:08 +0000 (+0200) Subject: x86/PV: assert page state in mark_pv_pt_pages_rdonly() X-Git-Tag: archive/raspbian/4.16.0+51-g0941d6cb-1+rpi1~2^2~42^2~279 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=6b1ca51b1a91d002636518afe4a8a50ba7212495;p=xen.git x86/PV: assert page state in mark_pv_pt_pages_rdonly() About every time I look at dom0_construct_pv()'s "calculation" of nr_pt_pages I question (myself) whether the result is precise or merely an upper bound. I think it is meant to be precise, but I think we would be better off having some checking in place. Hence add ASSERT()s to verify that - all pages have a valid L1...Ln (currently L4) page table type and - no other bits are set, in particular the type refcount is still zero. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c index 778c863ea4..6145d4320b 100644 --- a/xen/arch/x86/pv/dom0_build.c +++ b/xen/arch/x86/pv/dom0_build.c @@ -59,6 +59,16 @@ static __init void mark_pv_pt_pages_rdonly(struct domain *d, l1e_remove_flags(*pl1e, _PAGE_RW); page = mfn_to_page(l1e_get_mfn(*pl1e)); + /* + * Verify that + * - all pages have a valid L1...Ln page table type and + * - no other bits are set, in particular the type refcount is still + * zero. + */ + ASSERT((page->u.inuse.type_info & PGT_type_mask) >= PGT_l1_page_table); + ASSERT((page->u.inuse.type_info & PGT_type_mask) <= PGT_root_page_table); + ASSERT(!(page->u.inuse.type_info & ~PGT_type_mask)); + /* Read-only mapping + PGC_allocated + page-table page. */ page->count_info = PGC_allocated | 3; page->u.inuse.type_info |= PGT_validated | 1;